package chapter02.part07;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

/**
 * 学习 Java 中的正则表达式 API
 * 
 * 输入一个正则表达式 & 一个字符串
 * 输出匹配结果
 * 
 * @author insight
 * @since 2021/8/27
 */
public class RegexTest {
    public static void main(String[] args) {
        // System.out.print("Enter Pattern: ");
        // String patternStr = in.nextLine();
        // 匹配时间
        String patternStr = "(([1-9]|1[0-2]):([0-5][0-9]))[ap]m";
        String input = "11:59am";

        /* Java 编写正则匹配*/

        // 使用正则创建一个 Pattern 
        Pattern pattern = Pattern.compile(patternStr);
        // 创建 mather 输入对象是 CharSequence 比如 String StringBuilder
        Matcher matcher = pattern.matcher(input);
        // 调用 matches() 方法检测是否匹配
        if (!matcher.matches()) {
            System.out.println("No Match");
            return ;
        }

        System.out.println("Match");

        // 可以获取群组
        // 先获取群组数 然后打印每个群组
        int g = matcher.groupCount();
        if (g == 0) return ;

        char[] cs = input.toCharArray();
        for (int i = 0; i < cs.length; i++) {
            // 使用 start() end() group() 获取群组索引和内容
            // 索引 0 是整个输入 所以实际索引从 1 开始
            // 使用括号表示每个群组的边界
            // 打印空群组
            for (int j = 1; j <= g; j++) {
                if (i == matcher.start(j) && i == matcher.end(j))
                    System.out.print("()");
            }
            // 打印左边界
            for (int j = 1; j <= g; j++) {
                if (i == matcher.start(j) && i != matcher.end(j))
                    System.out.print("(");
            }
            System.out.print(cs[i]);
            // 打印右边界
            for (int j = 1; j <= g; j++) {
                if (i + 1 != matcher.start(j) && i + 1 == matcher.end(j))
                    System.out.print(")");
            }
        }
        System.out.println();
        
        // 在集合/流中匹配 需要将模式转换为谓词
        List<String> strings = List.of("11:59am", "12:06pm");
        List<String> ret =
                strings.stream().filter(pattern.asPredicate()).collect(Collectors.toList());
        ret.forEach(System.out::println);
    }
}